from rest_framework.views import APIView
from rest_framework.response import Response
from .sers import *
import jwt
from rest_framework.authentication import BaseAuthentication, TokenAuthentication


# 自定义一个 身份认证类
class MyTokenAuthentication(BaseAuthentication):

    def authenticate(self, request):
        token = request.GET.get("token")
        # 解析令牌  拿到了载荷信息
        try:
            payload = jwt.decode(token, "123")
        except Exception as e:
            print(e)
            return (None, None)
        uid = payload["uid"]
        user = User.objects.get(id=uid)
        # 固定的返回模式，是一个元组 第一个是用户对象 第二个 token令牌
        return (user, token)


#  用户个人信息操作接口

class UserInfoView(APIView):
    authentication_classes = [MyTokenAuthentication]

    def get(self, request):
        # 返回用户的信息
        # 获取传递来的令牌

        # 根据用户的ID 去查找 用户的信息
        print(request.user)
        if not request.user:
            # token认证失败，
            return Response({"msg": "身份认证失败", "code": 401})
        # 认证成功
        ser = UserInfoSer(request.user)
        return Response({"msg": "认证通过", "data": ser.data, "code": 200})

    def put(self, request):
        # 1、获取一个邮箱
        email = request.data.get("email")

        # 2、更新邮箱
        user = request.user
        if user:
            user.email = email  # 把新的邮箱给user的 email字段
            user.save()  # 保存
            # 3、返回
            return Response({"msg": "更新成功", "code": 200})
        return Response({"msg": "身份认证失败", "code": 400})


# 开发一个接口，根据上级ID去获取 对应的下级单位

class ChinaCityView(APIView):

    def get(self, request):
        #  根据parentid 来获取所有的下级单位，，例如 根据省份ID  去获取该省份下所有的市

        parent_id = request.GET.get("parent_id")

        queryset = ChinaCity.objects.filter(parentid=parent_id)

        ser = ChinaCitySer(queryset, many=True)

        return Response(ser.data)


# 开发 地址接口视图

class AddressView(APIView):
    authentication_classes = [MyTokenAuthentication]

    def get(self, request):

        # 查询地址
        queryset = Address.objects.filter(user_id=request.user.id)

        ser = AddressListSer(queryset, many=True)

        return Response(ser.data)

    def post(self, request):

        request.data["user"] = request.user.id
        # 1、创建一个序列器， 传入 要保存的数据
        ser = AddressSer(data=request.data)

        # 2、验证码数据
        if ser.is_valid():  # 验证数据，如果数据验证没有异常 则返回true，有异常返回false
            # 没有数据异常，就保存
            # 3、保存
            ser.save()
            resp = {"msg": "添加成功", "code": 200}
        else:
            print(ser.errors)  # 打印 验证数据失败的原因
            resp = {"msg": "添加失败", "code": 400}
        # 4、返回
        return Response(resp)

    def delete(self, request):

        # 删除地址, 根据地址的ID去删除
        address_id = request.GET.get("address")
        Address.objects.filter(id=address_id).delete()

        return Response({"msg": "删除成功", "code": 200})

    def put(self, request):

        # 找到这个地址，然后 修改地址为默认值，
        address1 = request.data.get("address1")
        address2 = request.data.get("address2")

        Address.objects.filter(id=address1).update(default=True)
        Address.objects.filter(id=address2).update(default=False)

        return Response({"msg": "修改成功"})
